package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	//openFile()
	ReadFile()
	//readWriteFile()
}

// 文件的打开和关闭操作
func openFile() {
	f, err := os.Open("../说明.txt")
	if err != nil {
		fmt.Println("文件打开失败")
		return
	}
	defer f.Close()

	fmt.Println("文件打开成功, 内容是：", f)
}

// 文件的读写操作
/**
ioutil.ReadFile
 使用ioutil一次将整个文件读入到内存中，这种方式适用于文件不大的情况
*/
func ReadFile() {
	// 读取文件 不需要close关闭文件 已经被封装到ReadFile()函数中了
	content, err := os.ReadFile("../说明.txt") // ioutil.ReadFile("../说明.txt")
	if err != nil {
		fmt.Println("文件读取失败", err)
		return
	}

	fmt.Printf("文件读取成功, 内容是：%v", string(content))
}

/**
	读取文件的内容并显示在终端(带缓冲中区的方式)，适合读取比较大的文件，
	使用 os.Open,file.Close() , bufio.NewReader() ,reader.ReadString() 函数和方法
**/

func readWriteFile() {

	f, err := os.Open("../说明.txt")
	if err != nil {
		fmt.Println("文件打开失败")
		return
	}
	// 当函数执行完毕后，自动调用Close()方法关闭文件，防止内存泄漏
	defer f.Close()

	// 创建一个流
	reader := bufio.NewReader(f)
	for {
		// 读取到一个换行就结束
		line, err := reader.ReadString('\n')
		if err == io.EOF { // io.EOF表示读取到文件末尾了
			break
		}
		fmt.Println(line)
	}

	fmt.Println("文件读取成功")
}
